package com.linln.modules.lzgd.service.impl;

import com.linln.common.data.PageSort;
import com.linln.common.enums.StatusEnum;
import com.linln.common.jpahelper.Criteria;
import com.linln.common.utils.StringUtil;
import com.linln.modules.lzgd.domain.BaseInfo;
import com.linln.modules.lzgd.repository.BaseInfoRepository;
import com.linln.modules.lzgd.service.BaseInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author 小懒虫
 * @date 2023/12/03
 */
@Service
public class BaseInfoServiceImpl implements BaseInfoService {

    @Autowired
    private BaseInfoRepository baseInfoRepository;

    /**
     * 根据ID查询数据
     * @param id 主键ID
     */
    @Override
    @Transactional
    public BaseInfo getById(Long id) {
        return baseInfoRepository.findById(id).orElse(null);
    }

    /**
     * 获取分页列表数据
     * @param example 查询实例
     * @return 返回分页数据
     */
    @Override
    public Page<BaseInfo> getPageList(Example<BaseInfo> example) {
        // 创建分页对象
        PageRequest page = PageSort.pageRequest("id", Sort.Direction.ASC);
        return baseInfoRepository.findAll(example, page);
    }

    /**
     * 保存数据
     * @param baseInfo 实体对象
     */
    @Override
    public BaseInfo save(BaseInfo baseInfo) {
        return baseInfoRepository.save(baseInfo);
    }

    /**
     * 状态(启用，冻结，删除)/批量状态处理
     */
    @Override
    @Transactional
    public Boolean updateStatus(StatusEnum statusEnum, List<Long> idList) {
        return baseInfoRepository.updateStatus(statusEnum.getCode(), idList) > 0;
    }

    @Override
    public StringBuffer validLzgdBaseInfo(List<BaseInfo> gdps) {
        StringBuffer msg=new StringBuffer();
        for (int i=0;i< gdps.size();i++){
            String line="";
            BaseInfo gdp=gdps.get(i);
           String isDuplicate= checkModel(gdps);
            if (!StringUtil.isEmpty(isDuplicate)) line += isDuplicate;

//            //
//            if (StringUtil.isEmpty(gdp.getName())) line += "名称不能为空；";
//
//            if (!StringUtil.isEmpty(line.trim())) {
//                line = "第" + (i + 1) + "行，" + line+"\n";
//                msg.append(line);
//            }
        }
        if (msg.length() > 0) {//存在错误
            msg.append("====导入失败，请修改后重试====\n");
        }
        return msg;
    }

    /**
     * 校验model是否重复
     * @param insertList
     * @return
     */
    private String checkModel(List<BaseInfo> insertList ){
        // 假设list中包含了一些对象
        Set<Object> duplicates = new HashSet<>();
        Set<Object> uniqueValues = new HashSet<>();
        for (BaseInfo obj : insertList) {
            Object fieldValue = obj.getJcbh();
            if (!uniqueValues.add(fieldValue)) {
                duplicates.add(fieldValue);
            }
        }
        // 输出重复的值
        return "以下字段存在重复：" + duplicates.toString()+";";
    }


    @Override
    public void exeImport(List<BaseInfo> inRegionGdps) {
        baseInfoRepository.saveAll(inRegionGdps);
    }

    @Override
    public List<BaseInfo> findAll(Criteria<BaseInfo> criteria) {
        return baseInfoRepository.findAll(criteria);
    }


    /**
     * 按年份统计
     * @return
     */
    @Override
    public List<Map<String, String>> statTotalNewLZCount(){
        return baseInfoRepository.statTotalNewLZCount();
    }

    /**
     * 按城市级别统计数据
     * @return
     */
    @Override
    public List<Map<String, String>> statUnLZCountByCityLevel(String cityLevel){
        List<Map<String, String>> maps=null;
        if(cityLevel=="sqs")
            maps=baseInfoRepository.statUnLZCountBySQS();
        else
            maps=baseInfoRepository.statUnLZCountByXSQ();
        return maps;
    }

    /**
     * 通过监测编号获取实体类
     * @param jcbh 主键ID
     * @return
     */
    @Override
    @Transactional
    public BaseInfo getByJcbh(String jcbh) {
        return baseInfoRepository.findByJcbh(jcbh);
    }

}